home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / fish / 001-100 / 001-025 / 004 / kermit / tty.c < prev    next >
C/C++ Source or Header  |  1995-03-17  |  5KB  |  231 lines

  1. /*    @(#)tty.c    1.2    7/3/85    */
  2.  
  3. #include "kermit.h"
  4. #include "errors.h"
  5.  
  6. #ifdef unix
  7. #  ifdef VER7
  8. #    include <sgtty.h>
  9. #    define TERM sgttyb 
  10. #  else
  11. #    include <termio.h>
  12. #    define TERM termio
  13. #  endif
  14. #else
  15. struct termio {
  16.     int speed;                /* Not really used yet */
  17. };
  18. #define TERM termio
  19. #endif    /* unix */
  20.  
  21. static struct TERM host_raw;        /* Host tty "raw" mode */
  22. static struct TERM host_cooked;        /* Host tty "cooked" mode */
  23. static struct TERM rem_raw;        /* remote tty line "raw" mode */
  24. static struct TERM rem_cooked;        /* remote tty line "cooked" mode */
  25.  
  26. static VOID ShowMode ();
  27.  
  28.  
  29. VOID GetModes ()
  30. {
  31.     DBUG_ENTER ("GetModes");
  32. #ifdef unix
  33. #ifdef VER7
  34.     if (cflg) {
  35.     gtty (0, &host_cooked);        /* save tty mode for later */
  36.     gtty (0, &host_raw);        /* host_raw for connect, send, rcv */
  37.     host_raw.sg_flags |= (RAW | TANDEM);
  38.     host_raw.sg_flags &= ~(ECHO | CRMOD);
  39.     }
  40.     gtty (remfd, &rem_raw);
  41.     rem_raw.sg_flags |= (RAW | TANDEM);
  42.     rem_raw.sg_flags &= ~(ECHO | CRMOD);
  43.     rem_raw.sg_ispeed = speed;
  44.     rem_raw.sg_ospeed = speed;
  45. #else
  46.     if (cflg) {
  47.     if (ioctl (0, TCGETA, &host_cooked) == -1) {
  48.         Error (HOST_TCGETA);
  49.         WrapUp (1);
  50.     } else {
  51.         host_raw = host_cooked;
  52.         host_raw.c_iflag = IGNBRK;
  53.         host_raw.c_oflag = 0;
  54.         host_raw.c_lflag &= ~(ISIG | ECHO | ICANON);
  55.         host_raw.c_cc[VMIN] = 1;
  56.         host_raw.c_cc[VTIME] = 1;
  57.         ShowMode ("initial host tty modes", &host_cooked);
  58.         ShowMode ("raw host tty modes", &host_raw);
  59.     }
  60.     }
  61.     if (remfd) {
  62.     if (ioctl (remfd, TCGETA, &rem_cooked) == -1) {
  63.         Error (REMOTE_TCGETA);
  64.         WrapUp (1);
  65.     } else {
  66.         rem_cooked.c_cflag &= ~HUPCL;    /* HACK! */
  67.         rem_raw = rem_cooked;
  68.         rem_raw.c_iflag = IGNBRK;
  69.         rem_raw.c_oflag = 0;
  70.         rem_raw.c_lflag &= ~(ISIG | ECHO | ICANON);
  71.         rem_raw.c_cc[VMIN] = 1;
  72.         rem_raw.c_cc[VTIME] = 1;
  73.         rem_raw.c_cflag = speed | CS8 | CREAD;
  74.         ShowMode ("initial remote tty modes", &rem_cooked);
  75.         ShowMode ("raw remote tty modes", &rem_raw);
  76.     }
  77.     }
  78. #endif
  79. #endif    /* unix */
  80.     DBUG_VOID_RETURN;
  81. }
  82.  
  83.  
  84. static VOID ShowMode (cp, tp)
  85. char *cp;
  86. struct TERM *tp;
  87. {
  88.     DBUG_ENTER ("ShowMode");
  89. #ifdef unix
  90. #ifndef VER7
  91.     DBUG_3 ("tty","%s",cp);
  92.     DBUG_3 ("tty", "c_iflag is %o", tp -> c_iflag);
  93.     DBUG_3 ("tty", "c_oflag is %o", tp -> c_oflag);
  94.     DBUG_3 ("tty", "c_cflag is %o", tp -> c_cflag);
  95.     DBUG_3 ("tty", "c_lflag is %o", tp -> c_lflag);
  96. #endif
  97. #endif    /* unix */
  98.     DBUG_VOID_RETURN;
  99. }
  100.  
  101.  
  102. SetTtyMode (fildes, mode)
  103. int fildes;
  104. struct TERM *mode;
  105. {
  106.     register int    status;
  107.  
  108.     DBUG_ENTER ("SetTtyMode");
  109. #ifdef unix
  110.     status = FALSE;
  111. #ifdef VER7
  112.     stty (fildes, mode);
  113.     status = TRUE;
  114. #else
  115.     if (ioctl (fildes, TCSETAW, mode) != -1) {
  116.     if (ioctl (fildes, TCXONC, 1) != -1) {
  117.         status = TRUE;
  118.     }
  119.     }
  120. #endif
  121. #else
  122.     DBUG_2 ("ttymode", "setting tty modes currently a NOP");
  123.     status = TRUE;
  124. #endif    /* unix */
  125.     DBUG_RETURN (status);
  126. }
  127.  
  128.  
  129. VOID HostRaw ()
  130. {
  131.     DBUG_ENTER ("HostRaw");
  132.     if (cflg && !SetTtyMode (0, &host_raw)) {
  133.     Error (HOST_RAW);
  134.     WrapUp (1);
  135.     }
  136.     DBUG_VOID_RETURN;
  137. }
  138.  
  139.  
  140. VOID HostCooked ()
  141. {
  142.     DBUG_ENTER ("HostCooked");
  143.     if (cflg && !SetTtyMode (0, &host_cooked)) {
  144.     Error (HOST_COOKED);
  145.     WrapUp (1);
  146.     }
  147.     DBUG_VOID_RETURN;
  148. }
  149.  
  150.  
  151. VOID SetSpeed()
  152. {
  153.     DBUG_ENTER ("SetSpeed");
  154.     if (speed) {        /* user specified a speed? */
  155. #ifdef AMIGA
  156.     printf ("warning -- speed currently ignored, use 'preferences'\n");
  157. #else
  158.     switch (speed) {    /* get internal system code */
  159.         case 110: 
  160.         speed = B110;
  161.         break;
  162.         case 150: 
  163.         speed = B150;
  164.         break;
  165.         case 300: 
  166.         speed = B300;
  167.         break;
  168.         case 1200: 
  169.         speed = B1200;
  170.         break;
  171.         case 2400: 
  172.         speed = B2400;
  173.         break;
  174.         case 4800: 
  175.         speed = B4800;
  176.         break;
  177.         case 9600: 
  178.         speed = B9600;
  179.         break;
  180.         case EXTA:
  181.         case 19200:
  182.             speed = EXTA;
  183.         break;
  184.          case EXTB:
  185.             speed = EXTB;
  186.         break;
  187.         default: 
  188.         Error (SPEED, speed);
  189.         break;
  190.     }
  191. #endif    /* AMIGA */
  192.     }
  193.     DBUG_VOID_RETURN;
  194. }
  195.  
  196.  
  197. VOID SetUp ()
  198. {
  199.     DBUG_ENTER ("SetUp");
  200.     if (remfd) {
  201.     DBUG_2 ("remtty", "set modes on communications line");
  202.     if (!SetTtyMode (remfd, &rem_raw)) {
  203.         Error (REMOTE_RAW);
  204.         WrapUp (1);
  205.     }
  206.     }
  207.     DBUG_VOID_RETURN;
  208. }
  209.  
  210.  
  211. VOID CleanUp ()
  212. {
  213.     DBUG_ENTER ("CleanUp");
  214.     if (remfd) {
  215.     if (!SetTtyMode (remfd, &rem_cooked)) {
  216.         Error (REMOTE_COOKED);
  217.         WrapUp (1);
  218.     }
  219.     }
  220.     DBUG_VOID_RETURN;
  221. }
  222.  
  223.  
  224. VOID NewSpeed (nspeed)
  225. int nspeed;
  226. {
  227.     DBUG_ENTER ("NewSpeed");
  228.     speed = nspeed;
  229.     DBUG_VOID_RETURN;
  230. }
  231.